/*
 * Copyright 2012 NJUT  qixiaobo. All rights reserved.
 */
package com.fujitsu.cn.fnst.interceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

import com.fujitsu.cn.fnst.base.BaseInterceptor;
import com.fujitsu.cn.fnst.entiy.User;
import com.fujitsu.cn.fnst.service.UserService;



/**
 * PostInterceptor.java
 * 
 * @author Qixiaobo-win8
 */
@Component
public class PostInterceptor extends BaseInterceptor  {

	@Resource
	private UserService userService;
	private final Logger log = Logger.getLogger(PostInterceptor.class);

	public PostInterceptor() {
		// TODO Auto-generated constructor stub
	}

	private String mappingURL;// 利用正则映射到需要拦截的路径
	public void setMappingURL(String mappingURL) {
		this.mappingURL = mappingURL;
	}

	/**
	 * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
	 * 
	 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
	 * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
	 */

	@Override
    public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		String url = request.getRequestURL().toString();
		HttpSession session=request.getSession();
		if (mappingURL == null || url.matches(mappingURL)) {
			String cookieValue = null;
			if ((cookieValue = getCookieValue(request, "user")) != null
			// 用户删除cookie无法立即删除，在浏览器关闭时才删除
					&& getCookieMaxAge(request, "user") != 0 && !isLogin(session)) {
				User user = userService.findByWorkerId(cookieValue);
				if (user != null) {
					session.setAttribute(LOGIN, "true");
					session.setAttribute("user", user);
					cookieValue = getCookieValue(request, ADMIN);
					// 设置是否是管理员
					if (cookieValue != null) {
						session.setAttribute(ADMIN, cookieValue);
					}
					MDC.put("userId", user.getWorkerId());
					MDC.put("userType", "0");
					logger.info("用户工号" + user.getWorkerId() + ",姓名"
							+ user.getUserName() + "通过cookie上线了");
				}
			}else{
				response.sendRedirect(request.getContextPath()+"/login");
				return false;
			}
			return true;
		}
		return true;
	}

	// 在业务处理器处理请求执行完成后,生成视图之前执行的动作

	@Override
    public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	/**
	 * 在DispatcherServlet完全处理完请求后被调用
	 * 
	 * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
	 */

	@Override
    public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}

}
